PerformanceΒΆ
!pip install mlfinlab
!pip install yfinance
# See https://plotly.com/python/static-image-export/
!wget https://github.com/plotly/orca/releases/download/v1.2.1/orca-1.2.1-x86_64.AppImage -O /usr/local/bin/orca
!chmod +x /usr/local/bin/orca
!apt-get install xvfb libgtk2.0-0 libgconf-2-4
Requirement already satisfied: mlfinlab in /usr/local/lib/python3.6/dist-packages (0.11.0)
Requirement already satisfied: cvxpy>=1.0.25 in /usr/local/lib/python3.6/dist-packages (from mlfinlab) (1.0.31)
Requirement already satisfied: pandas==0.25.3 in /usr/local/lib/python3.6/dist-packages (from mlfinlab) (0.25.3)
Requirement already satisfied: xmlrunner==1.7.7 in /usr/local/lib/python3.6/dist-packages (from mlfinlab) (1.7.7)
Requirement already satisfied: numba>=0.46.0 in /usr/local/lib/python3.6/dist-packages (from mlfinlab) (0.48.0)
Requirement already satisfied: numpy>=1.17.3 in /usr/local/lib/python3.6/dist-packages (from mlfinlab) (1.18.4)
Requirement already satisfied: matplotlib>=3.1.1 in /usr/local/lib/python3.6/dist-packages (from mlfinlab) (3.2.1)
Requirement already satisfied: statsmodels>=0.11.1 in /usr/local/lib/python3.6/dist-packages (from mlfinlab) (0.11.1)
Requirement already satisfied: scikit-learn>=0.21.3 in /usr/local/lib/python3.6/dist-packages (from mlfinlab) (0.22.2.post1)
Requirement already satisfied: scipy>=1.3.1 in /usr/local/lib/python3.6/dist-packages (from mlfinlab) (1.4.1)
Requirement already satisfied: osqp>=0.4.1 in /usr/local/lib/python3.6/dist-packages (from cvxpy>=1.0.25->mlfinlab) (0.6.1)
Requirement already satisfied: scs>=1.1.3 in /usr/local/lib/python3.6/dist-packages (from cvxpy>=1.0.25->mlfinlab) (2.1.2)
Requirement already satisfied: multiprocess in /usr/local/lib/python3.6/dist-packages (from cvxpy>=1.0.25->mlfinlab) (0.70.9)
Requirement already satisfied: ecos>=2 in /usr/local/lib/python3.6/dist-packages (from cvxpy>=1.0.25->mlfinlab) (2.0.7.post1)
Requirement already satisfied: python-dateutil>=2.6.1 in /usr/local/lib/python3.6/dist-packages (from pandas==0.25.3->mlfinlab) (2.8.1)
Requirement already satisfied: pytz>=2017.2 in /usr/local/lib/python3.6/dist-packages (from pandas==0.25.3->mlfinlab) (2018.9)
Requirement already satisfied: llvmlite<0.32.0,>=0.31.0dev0 in /usr/local/lib/python3.6/dist-packages (from numba>=0.46.0->mlfinlab) (0.31.0)
Requirement already satisfied: setuptools in /usr/local/lib/python3.6/dist-packages (from numba>=0.46.0->mlfinlab) (47.1.1)
Requirement already satisfied: pyparsing!=2.0.4,!=2.1.2,!=2.1.6,>=2.0.1 in /usr/local/lib/python3.6/dist-packages (from matplotlib>=3.1.1->mlfinlab) (2.4.7)
Requirement already satisfied: cycler>=0.10 in /usr/local/lib/python3.6/dist-packages (from matplotlib>=3.1.1->mlfinlab) (0.10.0)
Requirement already satisfied: kiwisolver>=1.0.1 in /usr/local/lib/python3.6/dist-packages (from matplotlib>=3.1.1->mlfinlab) (1.2.0)
Requirement already satisfied: patsy>=0.5 in /usr/local/lib/python3.6/dist-packages (from statsmodels>=0.11.1->mlfinlab) (0.5.1)
Requirement already satisfied: joblib>=0.11 in /usr/local/lib/python3.6/dist-packages (from scikit-learn>=0.21.3->mlfinlab) (0.15.1)
Requirement already satisfied: future in /usr/local/lib/python3.6/dist-packages (from osqp>=0.4.1->cvxpy>=1.0.25->mlfinlab) (0.16.0)
Requirement already satisfied: dill>=0.3.1 in /usr/local/lib/python3.6/dist-packages (from multiprocess->cvxpy>=1.0.25->mlfinlab) (0.3.1.1)
Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.6/dist-packages (from python-dateutil>=2.6.1->pandas==0.25.3->mlfinlab) (1.12.0)
Requirement already satisfied: yfinance in /usr/local/lib/python3.6/dist-packages (0.1.54)
Requirement already satisfied: numpy>=1.15 in /usr/local/lib/python3.6/dist-packages (from yfinance) (1.18.4)
Requirement already satisfied: requests>=2.20 in /usr/local/lib/python3.6/dist-packages (from yfinance) (2.23.0)
Requirement already satisfied: multitasking>=0.0.7 in /usr/local/lib/python3.6/dist-packages (from yfinance) (0.0.9)
Requirement already satisfied: pandas>=0.24 in /usr/local/lib/python3.6/dist-packages (from yfinance) (0.25.3)
Requirement already satisfied: chardet<4,>=3.0.2 in /usr/local/lib/python3.6/dist-packages (from requests>=2.20->yfinance) (3.0.4)
Requirement already satisfied: idna<3,>=2.5 in /usr/local/lib/python3.6/dist-packages (from requests>=2.20->yfinance) (2.9)
Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.6/dist-packages (from requests>=2.20->yfinance) (2020.4.5.1)
Requirement already satisfied: urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 in /usr/local/lib/python3.6/dist-packages (from requests>=2.20->yfinance) (1.24.3)
Requirement already satisfied: python-dateutil>=2.6.1 in /usr/local/lib/python3.6/dist-packages (from pandas>=0.24->yfinance) (2.8.1)
Requirement already satisfied: pytz>=2017.2 in /usr/local/lib/python3.6/dist-packages (from pandas>=0.24->yfinance) (2018.9)
Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.6/dist-packages (from python-dateutil>=2.6.1->pandas>=0.24->yfinance) (1.12.0)
/usr/local/bin/orca: Text file busy
Reading package lists... Done
Building dependency tree
Reading state information... Done
libgtk2.0-0 is already the newest version (2.24.32-1ubuntu1).
libgconf-2-4 is already the newest version (3.2.6-4ubuntu1).
xvfb is already the newest version (2:1.19.6-1ubuntu4.4).
0 upgraded, 0 newly installed, 0 to remove and 32 not upgraded.
import yfinance as yf
# "BB", "CVE", "NTAR", "HIVE", "N", "ACB", "APHA", "LSPD", "DSCI", "ERTH", "TTT", "AC", "HUT", "OCFT", "WIFI", "MVIS"
# DSCI NOT VIABLE THROUGH THIS PERIOD 2019-06-01
def enable_plotly_in_cell():
import IPython
from plotly.offline import init_notebook_mode
display(IPython.core.display.HTML('''<script src="/static/components/requirejs/require.js"></script>'''))
init_notebook_mode(connected=False)
enable_plotly_in_cell()
import pandas as pd
import plotly.offline as py
import plotly.graph_objs as go
import plotly.io as pio
from mlfinlab.online_portfolio_selection.benchmarks import *
def generate_performance(stocks, start_date="2020-03-01", end_date="2020-05-30", title="Canadian Stocks"):
stocks_string = " ".join(stocks)
data = yf.download(stocks_string, start=start_date, end=end_date,
group_by="ticker")
data = data.fillna(method='ffill')
# Drop columns with no entries
data = data.dropna(axis='columns', how='all')
pio.renderers.default = "svg" # Toggle for GitHub rendering.
nyse = pd.concat([data[ticker]["Close"] for ticker in stocks], axis=1)
nyse.columns = stocks
nyse_bah = BAH()
nyse_bah.allocate(nyse)
nyse_beststock = BestStock()
nyse_beststock.allocate(nyse)
nyse_crp = CRP()
nyse_crp.allocate(nyse)
nyse_bcrp = BCRP()
nyse_bcrp.allocate(nyse)
fig = go.Figure()
idx = nyse_bah.portfolio_return.index
fig.add_trace(go.Scatter(x=idx, y=nyse_beststock.portfolio_return['Returns'], name="Best Stock"))
fig.add_trace(go.Scatter(x=idx, y=nyse_bah.portfolio_return['Returns'], name="Buy and Hold"))
fig.add_trace(go.Scatter(x=idx, y=nyse_crp.portfolio_return['Returns'], name="CRP"))
fig.add_trace(go.Scatter(x=idx, y=nyse_bcrp.portfolio_return['Returns'], name="BCRP"))
fig.update_layout(title=title, xaxis_title='Date', yaxis_title='Relative Returns')
fig.show()
pio.write_image(fig, "gantt_suma.png", scale=3)
stocks_all = ["NEXCF", "ACB.TO", "BB.TO", "N.V", "APHA.TO", "TTT.CN", "HUT.TO", "HIVE.V", "AC.TO", "CVE.TO"]
# What I could have made if I all ined
generate_performance(stocks_all, start_date='2019-07-29', end_date='2020-05-30', title="What I could have made if I all ined ntar")
[*********************100%***********************] 10 of 10 completed
# Potential performance before the crash
generate_performance(stocks_all, start_date='2019-09-29', end_date='2020-02-28', title="Performance Before Crash")
[*********************100%***********************] 10 of 10 completed
# Potential performance before the crash
generate_performance(stocks_all, start_date='2020-02-27', end_date='2020-06-01', title="Performance After Crash")
[*********************100%***********************] 10 of 10 completed
# Without top performer
# Potential performance before the crash
beta_stocks = ["ACB.TO", "BB.TO", "N.V", "APHA.TO", "TTT.CN", "HUT.TO", "HIVE.V", "AC.TO", "CVE.TO"]
generate_performance(beta_stocks, start_date='2019-09-29', end_date='2020-02-28', title="Performance Before Crash without top performer")
[*********************100%***********************] 9 of 9 completed
# Potential performance before the crash
beta_stocks = ["ACB.TO", "BB.TO", "N.V", "APHA.TO", "TTT.CN", "HUT.TO", "HIVE.V", "AC.TO", "CVE.TO"]
generate_performance(beta_stocks, start_date='2020-02-27', end_date='2020-06-01', title="Performance After Crash")
[*********************100%***********************] 9 of 9 completed